home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / IMG2MAC.ASM < prev    next >
Assembly Source File  |  1986-10-07  |  19KB  |  495 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = MAC2IMG.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. IMG           DB      'IMG',0
  11. MAC           DB      'MAC',0
  12. FILENAME       DB      128 DUP(0)
  13. HANDLE_IN      DW      0
  14. HANDLE_OUT     DW      0
  15. TYPE_FROM      DW      0
  16. START_FILE     DW      0
  17.  
  18. LINES_PER_READ DW      0
  19. READS_PER_FILE DW      0
  20. BYTES_PER_READ DW      0
  21.  
  22. DISK_BUFFER    DD      0
  23. MAC_BUFFER     DD      0
  24.  
  25. IMG_HDR_SIZE   DW      44
  26. IMG_NAME       DB      'FILE GENERATED FROM MACPAINT  '
  27. IMG_HEIGHT     DW      720
  28. IMG_WIDTH      DW      576
  29. IMG_WIDTH_BYTE DW      72
  30. IMG_PIX_SIZE   DW      1
  31. IMG_PIX_FMT    DW      0
  32. IMG_COLOR      DW      0
  33. IMG_COMPRESS   DW      0
  34.  
  35. MAC_HDR_SIZE   DW      280H
  36. MAC_VERSION    DB      0
  37. MAC_LEN_FN     DB      0
  38. MAC_FILE_NAME  DB      63 DUP(0)
  39. MAC_FILE_TYPE  DB      'PNTG'
  40. MAC_FILE_CREAT DB      'MPNT'
  41. MAC_FLAGS      DB      1
  42. MAC_FILL1      DB      0
  43. MAC_VERT       DW      0
  44. MAC_HORIZ      DW      8001H
  45. MAC_FOLDER     DW      0
  46. MAC_PROT       DB      0
  47. MAC_FILL2      DB      0
  48. MAC_FORK       DD      0
  49. MAC_R_FORK     DD      0
  50. MAC_CRT_DATE   DB      9BH,41H,8CH,0FAH
  51. MAC_LST_MOD    DB      9BH,41H,8CH,0FEH
  52. MAC_FILL3      DB      27 DUP(0)
  53. MAC_OS           DW      0
  54.  
  55. MAC_REV        DB      0,0,0,2
  56. MAC_PAT_01     DB      0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH,0FFH
  57. MAC_PAT_02     DB      0DDH,0FFH,077H,0FFH,0FFH,077H,0FFH,0DDH
  58. MAC_PAT_03     DB      077H,0DDH,077H,0DDH,077H,0DDH,077H,0AAH
  59. MAC_PAT_04     DB      055H,0AAH,055H,0AAH,055H,0AAH,055H,055H
  60. MAC_PAT_05     DB      0FFH,055H,0FFH,055H,0FFH,055H,0FFH,0AAH
  61. MAC_PAT_06     DB      0AAH,0AAH,0AAH,0AAH,0AAH,0AAH,0AAH,0EEH
  62. MAC_PAT_07     DB      0DDH,0BBH,077H,0EEH,0DDH,0BBH,077H,088H
  63. MAC_PAT_08     DB      088H,088H,088H,088H,088H,088H,088H,0B1H
  64. MAC_PAT_09     DB      030H,003H,01BH,0D8H,0C0H,00CH,08DH,080H
  65. MAC_PAT_10     DB      010H,002H,020H,001H,008H,040H,004H,0FFH
  66. MAC_PAT_11     DB      088H,088H,088H,0FFH,088H,088H,088H,0FFH
  67. MAC_PAT_12     DB      080H,080H,080H,0FFH,008H,008H,008H,080H
  68. MAC_PAT_13     DB      000H,000H,000H,000H,000H,000H,000H,080H
  69. MAC_PAT_14     DB      040H,020H,000H,002H,004H,008H,000H,082H
  70. MAC_PAT_15     DB      044H,039H,044H,082H,001H,001H,001H,0F8H
  71. MAC_PAT_16     DB      074H,022H,047H,08FH,017H,022H,071H,055H
  72. MAC_PAT_17     DB      0A0H,040H,040H,055H,00AH,004H,004H,020H
  73. MAC_PAT_18     DB      050H,088H,088H,088H,088H,005H,002H,0BFH
  74. MAC_PAT_19     DB      000H,0BFH,0BFH,0B0H,0B0H,0B0H,0B0H,000H
  75. MAC_PAT_20     DB      000H,000H,000H,000H,000H,000H,000H,080H
  76. MAC_PAT_21     DB      000H,008H,000H,080H,000H,008H,000H,088H
  77. MAC_PAT_22     DB      000H,022H,000H,088H,000H,022H,000H,088H
  78. MAC_PAT_23     DB      022H,088H,022H,088H,022H,088H,022H,0AAH
  79. MAC_PAT_24     DB      000H,0AAH,000H,0AAH,000H,0AAH,000H,0FFH
  80. MAC_PAT_25     DB      000H,0FFH,000H,0FFH,000H,0FFH,000H,011H
  81. MAC_PAT_26     DB      022H,044H,088H,011H,022H,044H,088H,0FFH
  82. MAC_PAT_27     DB      000H,000H,000H,0FFH,000H,000H,000H,001H
  83. MAC_PAT_28     DB      002H,004H,008H,010H,020H,040H,080H,0AAH
  84. MAC_PAT_29     DB      000H,080H,000H,088H,000H,080H,000H,0FFH
  85. MAC_PAT_30     DB      080H,080H,080H,080H,080H,080H,080H,008H
  86. MAC_PAT_31     DB      01CH,022H,0C1H,080H,001H,002H,004H,088H
  87. MAC_PAT_32     DB      014H,022H,041H,088H,000H,0AAH,000H,040H
  88. MAC_PAT_33     DB      0A0H,000H,000H,004H,00AH,000H,000H,003H
  89. MAC_PAT_34     DB      084H,048H,030H,00CH,002H,001H,001H,080H
  90. MAC_PAT_35     DB      080H,041H,03EH,008H,008H,014H,0E3H,010H
  91. MAC_PAT_36     DB      020H,054H,0AAH,0FFH,002H,004H,008H,077H
  92. MAC_PAT_37     DB      089H,08FH,08FH,077H,098H,0F8H,0F8H,000H
  93. MAC_PAT_38     DB      008H,014H,02AH,055H,02AH,014H,008H,000H
  94. MAC_FILL4      DB      204 DUP(0)
  95.  
  96. LAST_CHAR      DB      0
  97. COUNT           DB      0
  98.  
  99. EIGHT           DW      8
  100.  
  101. TELL_HOW       DB      '┌──────────────────────────────────────────────┐',cr,lf
  102.            DB      '│ IMG2MAC filename.typ                         │',cr,lf
  103.            DB      '├──────────────────────────────────────────────┤',cr,lf
  104.            DB      '│ filename = IMG file                          │',cr,lf
  105.            DB      '│ typ      = must end in IMG                   │',cr,lf
  106.            DB      '├──────────────────────────────────────────────┤',cr,lf
  107.            DB      '│ Converts IMG file to MAC file  576 X 720     │',cr,lf
  108.            DB      '└──────────────────────────────────────────────┘',cr,lf
  109.            DB      7,'$'
  110. OPEN_ERROR     DB      'file not found...must end in IMG',cr,lf,'$'
  111. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  112. SIZE_ERROR     DB      'MACFILES must be 576 by 720 pixels',cr,lf,'$'
  113. ;╔═════════════════════════════════════════════════════════════════════════════╗
  114. ;║ ░░░░░░░░░░░ MAIN.ASM ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  115. ;╚═════════════════════════════════════════════════════════════════════════════╝
  116. MAIN           PROC    FAR
  117. ;┌─────────────────────────────────────────────────────────────────────────────┐
  118. ;│           RETURN SETUP                               │
  119. ;└─────────────────────────────────────────────────────────────────────────────┘
  120.            CLI
  121.            MOV     AX,CS               ;TEMP STACK
  122.            MOV     SS,AX               ;
  123.            MOV     ES,AX               ;
  124.            MOV     SP,OFFSET STACK           ;
  125.            STI
  126.            PUSH    DS               ;
  127.            XOR     AX,AX               ;
  128.            PUSH    AX               ;
  129.            CLD
  130. ;┌─────────────────────────────────────────────────────────────────────────────┐
  131. ;│           GET FILENAME FROM COMMAND LINE                       │
  132. ;└─────────────────────────────────────────────────────────────────────────────┘
  133.            MOV     SI,82H               ;START OF FILENAME
  134.            XOR     CH,CH               ;
  135.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  136.            CMP     CX,0               ;NO COMMANDS
  137.            JE      GFN800               ;ERROR
  138.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  139.            MOV     CS:START_FILE,DI
  140. GFN100:
  141.            LODSB                   ;GET CHARACTER
  142.            CMP     AL,20H               ;END OF FILENAME?
  143.            JE      GFN900               ;YES....BRANCH
  144.            CMP     AL,CR               ;END OF COMMAND LINE?
  145.            JE      GFN900               ;YES....ERROR
  146.            STOSB                   ;SAVE CHARACTER
  147.            CMP     AL,'.'                  ;START OF TYPE
  148.            JNE     GFN200               ;
  149.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  150.            JMP     SHORT GFN700
  151. GFN200:
  152.            CMP     AL,':'
  153.            JNE     GFN300
  154.            MOV     CS:START_FILE,DI
  155. GFN300:
  156.            CMP     AL,'\'
  157.            JNE     GFN700
  158.            MOV     CS:START_FILE,DI
  159. GFN700:
  160.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  161.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  162. GFN800:
  163.            MOV     DX,OFFSET TELL_HOW      ;
  164.            JMP     ERROR               ;
  165. GFN900:
  166.            MOV     AL,0               ;PUT NULL AT END OF STRING
  167.            STOSB                   ;
  168.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  169.            JNE     SET_BREAK
  170.            DEC     DI
  171.            MOV     CS:TYPE_FROM,DI
  172. ;┌─────────────────────────────────────────────────────────────────────────────┐
  173. ;│           TURN BREAK KEY ON                           │
  174. ;└─────────────────────────────────────────────────────────────────────────────┘
  175. SET_BREAK:
  176.            MOV     AX,CS               ;SET DATA SEGMENT
  177.            MOV     DS,AX               ;
  178.            CALL    BREAK_ON            ;SET UP CONTROL BREAK
  179. ;┌─────────────────────────────────────────────────────────────────────────────┐
  180. ;│           FIND DISK MEMORY                            │
  181. ;└─────────────────────────────────────────────────────────────────────────────┘
  182.            MOV     AX,OFFSET PROG_END      ;
  183.            MOV     BX,CS               ;
  184.            SHR     AX,1               ;
  185.            SHR     AX,1               ;
  186.            SHR     AX,1               ;
  187.            SHR     AX,1               ;
  188.            ADD     BX,AX               ;
  189.            ADD     BX,8               ;
  190.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  191.            ADD     BX,1000H
  192.            MOV     WORD PTR MAC_BUFFER+2,BX
  193. ;┌─────────────────────────────────────────────────────────────────────────────┐
  194. ;│           CHECK  FILENAME                               │
  195. ;└─────────────────────────────────────────────────────────────────────────────┘
  196.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  197.            MOV     DI,TYPE_FROM           ;
  198.            MOV     CX,3               ;
  199.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  200.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  201.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  202.            REP     CMPSB               ;
  203.            JNE     OIF050
  204. ;┌─────────────────────────────────────────────────────────────────────────────┐
  205. ;│           OPEN INPUT FILE                               │
  206. ;└─────────────────────────────────────────────────────────────────────────────┘
  207.            MOV     AH,3DH               ;OPEN FILE FOR READ
  208.            MOV     AL,0H               ;
  209.            MOV     DX,OFFSET FILENAME      ;
  210.            INT     21H               ;
  211.            JNC     OIF100
  212. OIF050:
  213.            MOV     DX,OFFSET OPEN_ERROR    ;
  214.            JMP     ERROR
  215. OIF100:
  216.            MOV     HANDLE_IN,AX
  217. ;┌─────────────────────────────────────────────────────────────────────────────┐
  218. ;│           CHANGE FILENAME                               │
  219. ;└─────────────────────────────────────────────────────────────────────────────┘
  220.            MOV     SI,OFFSET MAC           ;CHANGE TYPE ON FILENAME
  221.            MOV     DI,TYPE_FROM           ;
  222.            MOV     CX,3               ;
  223.            REP     MOVSB               ;
  224. ;┌─────────────────────────────────────────────────────────────────────────────┐
  225. ;│           CREATE OUTPUT TEMP FILE                           │
  226. ;└─────────────────────────────────────────────────────────────────────────────┘
  227.            MOV     AH,3CH               ;
  228.            MOV     CX,20H               ;
  229.            MOV     DX,OFFSET FILENAME      ;
  230.            INT     21H               ;
  231.            JNC     COF100
  232.            MOV     DX,OFFSET CREATE_ERROR  ;
  233.            JMP     ERROR
  234. COF100:
  235.            MOV     HANDLE_OUT,AX
  236. ;┌─────────────────────────────────────────────────────────────────────────────┐
  237. ;│           READ IMG HEADER                               │
  238. ;└─────────────────────────────────────────────────────────────────────────────┘
  239.            MOV     AH,3FH
  240.            MOV     BX,HANDLE_IN
  241.            MOV     CX,IMG_HDR_SIZE
  242.            MOV     DX,OFFSET IMG_NAME
  243.            INT     21H
  244. ;┌─────────────────────────────────────────────────────────────────────────────┐
  245. ;│           CHECK SIZE                               │
  246. ;└─────────────────────────────────────────────────────────────────────────────┘
  247.            CMP     IMG_WIDTH,576
  248.            JNE     CS900
  249.            CMP     IMG_HEIGHT,720
  250.            JE      CS999
  251. CS900:
  252.            MOV     DX,OFFSET SIZE_ERROR
  253.            JMP     ERROR
  254. CS999:
  255. ;┌─────────────────────────────────────────────────────────────────────────────┐
  256. ;│           MOVE PICTURE DATA BETWEEN FILES                       │
  257. ;└─────────────────────────────────────────────────────────────────────────────┘
  258. READ_BLOCK:
  259.            PUSH    DS
  260.            MOV     AH,3FH               ;
  261.            MOV     BX,HANDLE_IN           ;
  262.            MOV     CX,0FFFFH           ;
  263.            LDS     DX,DISK_BUFFER           ;
  264.            INT     21H               ;
  265.            POP     DS
  266. ;┌─────────────────────────────────────────────────────────────────────────────┐
  267. ;│           EXPAND DATA                               │
  268. ;└─────────────────────────────────────────────────────────────────────────────┘
  269.            PUSH    DS
  270.            MOV     DX,720               ;COUNT
  271.  
  272.            LDS     SI,CS:DISK_BUFFER
  273.            LES     DI,CS:MAC_BUFFER
  274. ED100:
  275.            MOV     CX,71               ;BYTES PER LINE
  276.            MOV     BX,-1
  277. ED200:
  278.            LODSB
  279. ED250:
  280.            MOV     CS:COUNT,0
  281.            MOV     CS:LAST_CHAR,AL
  282. ED300:
  283.            LODSB
  284.            CMP     AL,CS:LAST_CHAR
  285.            JNE     ED400
  286.            INC     CS:COUNT
  287.            MOV     BX,-1
  288.            JMP     SHORT ED700
  289. ED400:
  290.            CMP     CS:COUNT,0
  291.            JE      ED500
  292.            PUSH    AX
  293.            MOV     AL,CS:COUNT
  294.            NEG     AL
  295.            STOSB
  296.            MOV     AL,CS:LAST_CHAR
  297.            STOSB
  298.            POP     AX
  299.            MOV     CS:COUNT,0
  300.            MOV     CS:LAST_CHAR,AL
  301.            JMP     SHORT ED700
  302. ED500:
  303.            CMP     BX,-1
  304.            JNE     ED600
  305.            MOV     BX,DI
  306.            PUSH    AX
  307.            XOR     AL,AL
  308.            STOSB
  309.            POP     AX
  310.            JMP     SHORT ED650
  311. ED600:
  312.            INC     BYTE PTR ES:[BX]
  313. ED650:
  314.            PUSH    AX
  315.            MOV     AL,CS:LAST_CHAR
  316.            STOSB
  317.            POP     AX
  318.            MOV     CS:LAST_CHAR,AL
  319. ED700:
  320.            LOOP    ED300
  321.            CMP     CS:COUNT,0
  322.            JE      ED800
  323.            MOV     AL,CS:COUNT
  324.            NEG     AL
  325.            STOSB
  326.            JMP     SHORT ED850
  327. ED800:
  328.            CMP     BX,-1
  329.            JE      ED900
  330.            INC     BYTE PTR ES:[BX]
  331. ED850:
  332.            MOV     AL,CS:LAST_CHAR
  333.            STOSB
  334. ED900:
  335.            DEC     DX
  336.            JZ      ED999
  337.            JMP     ED100
  338. ED999:
  339.            POP     DS
  340. ;┌─────────────────────────────────────────────────────────────────────────────┐
  341. ;│           PUT FILENAME IN FILE                           │
  342. ;└─────────────────────────────────────────────────────────────────────────────┘
  343.            MOV     AX,DI
  344.            ADD     AX,MAC_HDR_SIZE
  345.            SUB     AX,128
  346.            XCHG    AH,AL
  347.            MOV     WORD PTR MAC_FORK+2,AX
  348.  
  349.            PUSH    DI
  350.            MOV     AX,CS
  351.            MOV     ES,AX
  352.            MOV     DS,AX
  353.            MOV     SI,START_FILE
  354.            MOV     DI,OFFSET MAC_FILE_NAME
  355.            MOV     BX,OFFSET MAC_LEN_FN
  356. PFN100:
  357.            LODSB
  358.            CMP     AL,0
  359.            JE      PFN900
  360.            STOSB
  361.            INC     BYTE PTR [BX]
  362.            JMP     SHORT PFN100
  363. PFN900:
  364. ;┌─────────────────────────────────────────────────────────────────────────────┐
  365. ;│           WRITE MAC HEADER                            │
  366. ;└─────────────────────────────────────────────────────────────────────────────┘
  367.            MOV     AH,40H
  368.            MOV     BX,HANDLE_OUT
  369.            MOV     CX,MAC_HDR_SIZE
  370.            MOV     DX,OFFSET MAC_VERSION
  371.            INT     21H
  372. ;┌─────────────────────────────────────────────────────────────────────────────┐
  373. ;│           WRITE DATA                               │
  374. ;└─────────────────────────────────────────────────────────────────────────────┘
  375.            POP     CX
  376.            PUSH    DS
  377.            MOV     AH,40H               ;
  378.            MOV     BX,HANDLE_OUT           ;
  379.            LDS     DX,MAC_BUFFER          ;
  380.            INT     21H               ;
  381.            POP     DS
  382. ;┌─────────────────────────────────────────────────────────────────────────────┐
  383. ;│           CLOSE FILES                               │
  384. ;└─────────────────────────────────────────────────────────────────────────────┘
  385. CLOSE_FILE:
  386.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  387.            MOV     AH,3EH               ;
  388.            INT     21H               ;
  389.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  390.            MOV     AH,3EH               ;
  391.            INT     21H               ;
  392.  
  393.            JMP     EXIT
  394. ERROR:
  395.            MOV     AX,CS
  396.            MOV     DS,AX
  397.            MOV     AH,9
  398.            INT     21H
  399. EXIT:
  400.            CALL    BREAK_OFF           ;BREAK KEY RESET
  401.            RET                   ;
  402. MAIN           ENDP
  403. ;╔═════════════════════════════════════════════════════════════════════════════╗
  404. ;╚═════════════════════════════════════════════════════════════════════════════╝
  405. EOI          EQU      20H              ;END OF INTERRUPT
  406. BRKINT          EQU      1BH              ;BREAK INTERRUPT
  407. SAV_BRK       DW       ?
  408. ;╔═════════════════════════════════════════════════════════════════════════════╗
  409. ;║ ░░░░░░░░░░ BREAK_ON ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  410. ;╚═════════════════════════════════════════════════════════════════════════════╝
  411.           PUBLIC   BREAK_ON
  412. BREAK_ON      PROC     NEAR
  413.           PUSH     AX
  414.           PUSH     BX               ;SAVE REGISTERS
  415.           PUSH     CX               ;
  416.           PUSH     DX               ;
  417.           PUSH     SI               ;
  418.           PUSH     ES               ;
  419.  
  420.           XOR      BX,BX               ;SEGMENT 0
  421.           MOV      ES,BX               ;
  422.           MOV      SI,BRKINT*4           ;OFFSET OF INTERUPT VECTOR
  423.  
  424.           MOV      CX,ES:WORD PTR[SI]      ;OFFSET OF CURRENT VECT
  425.           MOV      DX,ES:WORD PTR[SI+2]    ;SEGMENT OF CURRENT VECT
  426.           MOV      CS:SAV_BRK,CX           ;SAVE OFFSET
  427.           MOV      CS:SAV_BRK+2,DX           ;SAVE SEGMENT
  428.  
  429.           MOV      AX,OFFSET BREAK           ;
  430.           CLI                   ;NO INTERRUPTS
  431.           MOV      ES:WORD PTR[SI],AX      ;SET OFFSET
  432.           MOV      AX,CS               ;SET THIS CODE SEGMENT
  433.           MOV      ES:WORD PTR[SI+2],AX    ;MOVE SEG ADDR TO INT.VECT
  434.           STI                   ;INTERRUPTS BACK ON
  435.  
  436.           POP      ES               ;RESTORE REGISTERS
  437.           POP      SI               ;
  438.           POP      DX               ;
  439.           POP      CX               ;
  440.           POP      BX               ;
  441.           POP      AX               ;
  442.           RET                   ;
  443. BREAK_ON      ENDP
  444. ;╔═════════════════════════════════════════════════════════════════════════════╗
  445. ;║ ░░░░░░░░░░ BREAK_OFF ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  446. ;╚═════════════════════════════════════════════════════════════════════════════╝
  447.           PUBLIC   BREAK_OFF
  448. BREAK_OFF     PROC     NEAR
  449.  
  450.           PUSH     AX               ;
  451.           PUSH     CX               ;
  452.           PUSH     DX               ;
  453.           PUSH     DI               ;
  454.           PUSH     ES               ;
  455.  
  456.           XOR      AX,AX               ;
  457.           MOV      ES,AX               ;SEGMENT 0
  458.           MOV      CX,CS:SAV_BRK           ;RESET VECTOR BACK TO OLD RTN
  459.           MOV      DX,CS:SAV_BRK+2           ;
  460.           MOV      DI,BRKINT*4           ;
  461.           CLI                   ;NO INTERRUPTS
  462.           MOV      ES:WORD PTR[DI],CX      ;
  463.           MOV      ES:WORD PTR[DI+2],DX    ;
  464.           STI                   ;INTERRUPTS BACK ON
  465.  
  466.           POP      ES               ;
  467.           POP      DI               ;
  468.           POP      DX               ;
  469.           POP      CX               ;
  470.           POP      AX               ;
  471.           RET                   ;
  472. BREAK_OFF     ENDP
  473. ;╔═════════════════════════════════════════════════════════════════════════════╗
  474. ;║ ░░░░░░░░░░ BREAK ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║ J
  475. ;╚═════════════════════════════════════════════════════════════════════════════╝
  476.           PUBLIC   BREAK
  477. BREAK          PROC     FAR
  478.  
  479.           MOV      AX,CS
  480.           MOV      DS,AX
  481.           MOV      AL,EOI               ;
  482.           OUT      020H,AL               ;
  483.           CALL     BREAK_OFF
  484.           MOV      SP,OFFSET STACK-4       ;
  485.           RET
  486.  
  487. BREAK          ENDP
  488. ;┌─────────────────────────────────────────────────────────────────────────────┐
  489. ;└─────────────────────────────────────────────────────────────────────────────┘
  490.            DB      64 DUP('STACK')
  491. STACK           EQU     $
  492. PROG_END       EQU     $
  493. CSEG           ENDS
  494.            END     MAIN
  495.